package cn.maxwell.service.impl;

import cn.maxwell.domain.MovieTicket;
import cn.maxwell.domain.User;
import cn.maxwell.enums.GlobalErrorCode;
import cn.maxwell.exception.GlobalCustomException;
import cn.maxwell.feignclient.MoveFeiGinClient;
import cn.maxwell.mapper.UserMapper;
import cn.maxwell.result.JsonResult;
import cn.maxwell.service.IUserService;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author maxwell
 * @since 2022-08-29
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    @Resource
    private UserMapper userMapper;

    @Resource
    private MoveFeiGinClient moveFeiGinClient;

    /**
     * 电影票信息查询：通过openfeign接口调用电影微服务
     */
    @Override
    public JsonResult getMovie() {
        return moveFeiGinClient.list();
    }

    /**
     * 购买电影票
     * 传入要购买的电影票Id，调用电影服务进行购买，购买成功扣减用户余额
     * @param movieId
     * @return
     */
    @Override
    public JsonResult ByTicket(Long movieId) {
        //购买电影票
        JsonResult jsonResult = moveFeiGinClient.byMovieTicket(1l, movieId, 2);
        if(!jsonResult.isSuccess()){
           throw new GlobalCustomException(GlobalErrorCode.SERVICE_ERROR);
        }
        //添加用户信息
        User user = new User();
        user.setId(1l);
        //扣减余额
        BigDecimal bigDecimal = JsonResult.getBigDecimal(jsonResult.getData());
        BigDecimal newDecimal = user.getBalance().subtract(bigDecimal);
        user.setBalance(newDecimal);
        //更新数据库表
        userMapper.updateById(user);
        return JsonResult.success();
    }

    /**
     * 观看电影：调用电影微服务
     * @param movieId
     * @return
     */
    @Override
    public JsonResult seeMovie(Long movieId) {
        moveFeiGinClient.seeMovie(movieId,1l);
        return JsonResult.success();
    }

    /**
     * 新增用户并随机赠送一张电影票
     * @param username
     */
    @Override
    public JsonResult addUser(String username) {
        //保存用户信息
        User user = new User();
        user.setUsername(username);
        user.setBalance(BigDecimal.valueOf(1000));
        userMapper.insert(user);
        //随机获取一个电影票对象（电影票信息）
        // 1.查询所有电影票 @TODO 做的更好的话，不要用list，专门再来一个接口，查询可以赠送的电影票
        JsonResult jsonResult = moveFeiGinClient.list();
        // 如果是Object 需要转换成list对象集合，需要像下面这样转，用强转要报错
        List<MovieTicket> movieTickets = JSONObject.parseArray(JSONObject.toJSONString(jsonResult.getData()), MovieTicket.class);
        // 得到随机数，随便拿一张电影票:Math.random()方法
        int random = (int)(Math.random() * movieTickets.size());
        MovieTicket movieTicket = movieTickets.get(random);
        // 给用户送电影票
        moveFeiGinClient.byMovieTicket(2l,user.getId(),1);
        return jsonResult.success();
    }
}
